import matplotlib.pyplot as plt

# 1. 数据准备
algorithms = ['MOGRO', 'NSGA-II', 'MOPSO', 'SA', 'MILP', 'GB-MIP', 'PGB-MIP']
avg_penalty = [35671, 37251, 38391, 54738, 83583, 95122, 73978]

# 2. 创建画布与样式设置
plt.figure(figsize=(12, 8))
# sns.set_style("whitegrid")  # 白色网格背景
# plt.rcParams['font.family'] = 'Arial'  # 字体设置

# 3. 绘制折线图
plt.plot(algorithms, avg_penalty,
         marker='o',           # 圆点标记
         markersize=8,
         color='black',        # 黑色折线
         linewidth=3,
         linestyle='-',
         label='平均惩罚值')

# 4. 添加数据标签
for i, rate in enumerate(avg_penalty):
    plt.text(i, rate + 100, rate,  # 标签位置和内容
             ha='center', va='bottom',
             fontsize=14,
             color='black')

# 5. 坐标轴与标题设置
plt.ylim(30000, 100000)  # 纵轴范围匹配原图
# plt.yticks(np.arange(65, 72.5, 1))  # 刻度间隔1%
plt.xlabel('算法', fontsize=16, fontname="SimHei", labelpad=10)
plt.ylabel('平均惩罚值', fontsize=16, fontname="SimHei", labelpad=10)
plt.xticks(fontsize=14, fontname="Times New Roman")  # 确保刻度为整数
plt.yticks(fontsize=14, fontname="Times New Roman")  # X轴刻度调整
# plt.title('不同算法填充率对比', fontsize=14, pad=20)

# 6. 网格与边框优化
plt.grid(axis='y', linestyle='--', alpha=0.7)
# sns.despine(left=True, bottom=True)  # 移除左侧和底部边框

# 7. 显示图形
plt.tight_layout()
plt.show()